package ar.republicagroup.reportes.util;


import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Logger;

public class JavaMailUtil {
	
	private static JavaMailUtil instance;
	private Session session;
	private MimeMessage message;
		
	private static Logger log = Logger.getLogger(JavaMailUtil.class);
        private static final String MAIL_CONFIG_FILE_ABSOLUTE_PATH = "C:\\Program Files\\Republica Group\\config\\mail.properties";
        
	private JavaMailUtil(){ }
	
	
	public static JavaMailUtil getInstance(){
		if(instance==null){
			instance= new JavaMailUtil();
		}
		return instance;	
	}
	
	
	public void enviarMensajeViaSMTP(String mensajeToSend,String filePath,String fileName){
		
		try{
                        log.info("Enviando email ...");    
                    
                        Properties prop = new Properties();
                        InputStream inputStream = new FileInputStream(MAIL_CONFIG_FILE_ABSOLUTE_PATH);
                        prop.load(inputStream);
		
			// Creamos un Session con las propiedades del servidor SMTP 
			
			session = Session.getDefaultInstance(prop);
			session.setDebug(true); // Muestra por consola el debug mientras envia el email(para detectar errores)
		
                        //Creamos un nuevo mensaje Mime
			MimeMessage email 		= new MimeMessage(session);
			email.setFrom(new InternetAddress(prop.getProperty(("mail.smtp.from"))));
			email.addRecipient(Message.RecipientType.TO, new InternetAddress(prop.getProperty("mail.smtp.destinatario")));
			email.addRecipient(Message.RecipientType.CC, new InternetAddress(prop.getProperty("mail.smtp.copia")));
			email.setSubject(prop.getProperty("mail.smtp.subject"));
			
             
                        // Se compone el adjunto 
                        BodyPart adjunto = new MimeBodyPart();
                        adjunto.setDataHandler(
                            new DataHandler(new FileDataSource(filePath)));
                        adjunto.setFileName(fileName);
                        
                        // Se compone la parte del texto
                        BodyPart texto = new MimeBodyPart();
                        texto.setText(mensajeToSend);
                        
                        // Una MultiParte para agrupar texto e imagen.
                        MimeMultipart multiParte = new MimeMultipart();
                        multiParte.addBodyPart(texto);
                        multiParte.addBodyPart(adjunto);
                        
                                               
                        //Se adjunta el archivo y el texto al email
                        email.setContent(multiParte);
                        
                        // Con Transport nos conectamos al servidor SMTP y enviamos el mensaje 
			Transport t = session.getTransport("smtp");
			t.connect(prop.getProperty("mail.smtp.user").trim(),prop.getProperty("mail.smtp.password").trim());
			t.sendMessage(email,email.getAllRecipients());
			t.close();
                        
                        log.info("Email enviado correctamente! :D ");                        
			
			}catch(IOException | MessagingException ex){
                            log.info("Se produjo un error enviando el email...");
                            log.error(ex.getMessage(), ex);
                        }
		
		
		
		
	}
	

}
